package facade.Docente;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import dao.implementations.postgresql.Docente.DocenteDB;
import dao.interfaces.Docente.IDocente;
import dao.transferObjects.Gae.AlumnoTO;
import facade.FacadeBase;

public class FacadeDocente extends FacadeBase
{
	public int crearCursoTemp(List<AlumnoTO> alumnosCurso) {
		List<AlumnoTO> newListaAlumnos = new ArrayList<AlumnoTO>();
		int resp = -1;		
		this.connection.setAutoCommit(false);
		
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		//Con esto verificamos que todas las matriculas sean distintas.
		//En caso de existir una matricula repeditda dentro de el list, esta es eliminada.
		//El objeto alumnos con replica de matricula no es agregado a la nueva lista.
		for(int i=0;i<alumnosCurso.size();i++)
		{
			Boolean agregar = true;
			for(int j=i+1;j<alumnosCurso.size();j++)
			{
				if(alumnosCurso.get(i).getMatricula()==alumnosCurso.get(j).getMatricula())
				{
					agregar = false;
					break;
				}
			}
			if(agregar)
				newListaAlumnos.add(alumnosCurso.get(i));
		}
		
		for(int i=0;i<newListaAlumnos.size();i++)
		{
			resp = docenteDB.crearCursoTemp(newListaAlumnos.get(i));
			
			//Con esto comprabamos que cada insercion sea satisfactoria
			//En caso de un error hacemos un rollback
			if(resp < 1)
			{
				resp = -1;
				break;
			}
		}
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}
	
	public List<AlumnoTO> obtenerCursoTemp()
	{
		List<AlumnoTO> alumnosCurso = new ArrayList<AlumnoTO>();
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		alumnosCurso = docenteDB.obtenerCursoTemp();
		
		this.closeConnection();		
		return alumnosCurso;
	}
	
	public int eliminarCursoTemp()
	{
		int resp = -1;
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		resp = docenteDB.eliminarCursoTemp();
		
		this.closeConnection();		
		return resp;
	}
	public int eliminarDocente(int rut)
	{
		int resp = -1;
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		resp = docenteDB.eliminarDocente(rut);
		
		this.closeConnection();		
		return resp;
	}
	/*
	public int crearCurso(CursoTO curso)
	{
		int resp = -1;
		int id_curso;
		this.connection.setAutoCommit(false);
		
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		id_curso = docenteDB.obtenerSgteIDCurso();
		curso.setId_curso(id_curso);
		
		resp = docenteDB.crearCurso(curso);
		
		for(int i=0;i<curso.getListaAlumnos().size();i++)
		{
			//Con esto comprabamos que cada insercion sea satisfactoria
			//En caso de un error hacemos un rollback
			if(resp < 1){
				resp = -1;
				break;
			}
			
			curso.getListaAlumnos().get(i).setId_curso(id_curso);
			resp = docenteDB.crearAlumnoCurso(curso.getListaAlumnos().get(i));
		}
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}
	*/
	/*
	public int modificarCurso(CursoTO curso)
	{
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		resp = docenteDB.modificarCurso(curso);
		
		//Con esto comprabamos que cada insercion sea satisfactoria
		//En caso de un error hacemos un rollback
		if(resp > -1){
			
			// Eliminamos los alumnos del curso para luego ingresar los nuevos alumnos
			resp = docenteDB.eliminarAlumnosCurso(curso);
			
			if(resp > 0){
				for(int i=0;i<curso.getListaAlumnos().size();i++)
				{	
					//Con esto comprabamos que cada insercion sea satisfactoria
					//En caso de un error hacemos un rollback
					if(resp < 1){
						resp = -1;
						break;
					}
					curso.getListaAlumnos().get(i).setId_curso(curso.getId_curso());
					resp = docenteDB.crearAlumnoCurso(curso.getListaAlumnos().get(i));
				}
			}
			else{
				resp = -1;
			}
		}
		else{
			resp = -1;
		}
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		
		return resp;
	}
	*/
	/*
	public int eliminarCurso(CursoTO curso)
	{
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		resp = docenteDB.eliminarAlumnosCurso(curso);
		
		if(resp > 0)
			resp = docenteDB.eliminarCurso(curso); 
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}
	*/
	/*
	public List<CursoTO> obtenerTodosCurso()
	{
		List<CursoTO> listaCurso = new ArrayList<CursoTO>();
		
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		listaCurso = docenteDB.obtenerTodosCurso();
		
		this.closeConnection();
		
		return listaCurso;
	}
	*/
	/*
	public List<CursoTO> obtenerTodosCursoDocente(UsuarioTO usuario)
	{
		List<CursoTO> listaCurso = new ArrayList<CursoTO>();
		
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		listaCurso = docenteDB.obtenerTodosCursoDocente(usuario);
		
		this.closeConnection();
		
		return listaCurso;
	}
	*/
	/*
	public List<AlumnoTO> obtenerAlumnosCurso(CursoTO curso)
	{
		List<AlumnoTO> alumnosCurso = new ArrayList<AlumnoTO>();
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		alumnosCurso = docenteDB.obtenerAlumnosCurso(curso);
		
		this.closeConnection();		
		return alumnosCurso;
	}
	*/
	
	
	/*
	public List<AlumnoTO> obtenerAlumnosGae(GaeTO gae)
	{
		List<AlumnoTO> alumnosGae = new ArrayList<AlumnoTO>();
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		alumnosGae = docenteDB.obtenerAlumnosGae(gae);
		
		this.closeConnection();		
		return alumnosGae;
	}
	*/
	/*
	public List<GaeTO> obtenerGaesCurso(CursoTO curso)
	{
		List<GaeTO> listaGrupos = new ArrayList<GaeTO>();
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		listaGrupos = docenteDB.obtenerGaesCurso(curso);
		
		this.closeConnection();		
		return listaGrupos;
	}
	*/	
	/*
	public int crearGae(GaeTO gae, UsuarioTO usuario)
	{
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		IDocente docenteDB = new DocenteDB(this.connection.getConnection());
		
		//Primero registramos la cuenta de usuario
		resp = usuarioDB.registrarUsuario(usuario);
		
		//Asignamos el id_gae al GAE a crear
		gae.setId_gae(docenteDB.obtenerSgteIDGae());
		
		//Segundo creamos el GAE
		if(resp > 0){
			resp = docenteDB.crearGAE(gae);
		}
		//Tercero establecimos a un alumno del gae como representante
		//(esto asignandole al alumno representante, el rut_gae)
		if(resp > 0){
			resp = docenteDB.asignarAlumnoRepresentant(gae);
		}
		//Cuarto asocioamos los alumnos al gae 
		//(esto pasandole a cada integrante el id_gae)
		if(resp > 0){
			AlumnoTO alumno = new AlumnoTO();
			for(int i=0;i<gae.getListaAlumnosGAE().size();i++){
				alumno = gae.getListaAlumnosGAE().get(i);
				resp = docenteDB.asignarAlumnoGae(gae, alumno);
				if(resp < 1){
					resp = -1;
					break;
				}
			}
		}
		
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}
	*/
	/*
	public int modificarGae(GaeTO gaeOriginal, UsuarioTO usuarioOrignal, GaeTO gaeNuevo, UsuarioTO usuarioNuevo)
	{
		int resp = -1;
		this.connection.setAutoCommit(false);
		
		IUsuario usuarioDB = new UsuarioDB(this.connection.getConnection());
		IProducto productoDB = new ProductoDB(this.connection.getConnection());
		IReporte reporteDB = new ReporteDB(this.connection.getConnection());
		IGae gaeDB = new GaeDB(this.connection.getConnection());
		IAlumno alumnoDB = new AlumnoDB(this.connection.getConnection());
		
		
		if(usuarioOrignal.getRut() != usuarioNuevo.getRut()){
			
			//creamos nuevo usuario
			resp = usuarioDB.registrarUsuario(usuarioNuevo);
			
			//creamos nuevo gae
			gaeNuevo.setRut_gae(usuarioNuevo.getRut());
			resp = gaeDB.crearGAE(gaeNuevo);
			
			//eliminamos alumnos pretenecientes al gaeOriginal
			if(resp >= 0){
				for(int i=0;i<gaeOriginal.getListaAlumnosGAE().size();i++){
					resp = alumnoDB.eliminarAlumno(gaeOriginal.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//insertamos alumnos eliminados
			if(resp >= 0){
				for(int i=0;i<gaeOriginal.getListaAlumnosGAE().size();i++){
					gaeOriginal.getListaAlumnosGAE().get(i).setId_curso(gaeOriginal.getId_curso());
					resp = alumnoDB.insertarAlumno(gaeOriginal.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//asociamos alumnos al gae
			if(resp >= 0){
				for(int i=0;i<gaeNuevo.getListaAlumnosGAE().size();i++){
					gaeNuevo.getListaAlumnosGAE().get(i).setId_curso(gaeOriginal.getId_curso());
					resp = alumnoDB.asignarAlumnoGae(gaeNuevo, gaeNuevo.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//asociamos alumno representante
			if(resp > 0){
				resp = alumnoDB.asignarAlumnoRepresentante(gaeNuevo);
			}
			
			
			//re-asociamos los productos del gaeOriginal al gaeNuevo 
			if(resp > 0){
				resp = productoDB.reAsociarProducto(gaeOriginal, gaeNuevo);
			}
			
			//re-asociamos los reportes del gaeOriginal al gaeNuevo 
			if(resp >= 0){
				resp = reporteDB.reAsociarReporte(gaeOriginal, gaeNuevo);
			}
			
			//eliminamos gae antiguo
			if(resp >= 0){
				resp = gaeDB.eliminarGae(gaeOriginal);
			}
			
			//eliminamos usuario antiguo
			if(resp >= 0){
				resp = usuarioDB.eliminarUsuario(usuarioOrignal);
			}
		}
		else{
			resp = 0;
		
			//actualismos gaeOriginal por gaeNuevo
			if(resp >= 0){
				resp = gaeDB.modificarGae(gaeNuevo);
			}
			
			//eliminamos alumnos pretenecientes al gaeOriginal
			if(resp >= 0){
				for(int i=0;i<gaeOriginal.getListaAlumnosGAE().size();i++){
					resp = alumnoDB.eliminarAlumno(gaeOriginal.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//insertamos alumnos eliminados
			if(resp >= 0){
				for(int i=0;i<gaeOriginal.getListaAlumnosGAE().size();i++){
					gaeOriginal.getListaAlumnosGAE().get(i).setId_curso(gaeOriginal.getId_curso());
					resp = alumnoDB.insertarAlumno(gaeOriginal.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//asociamos alumnos al gae
			if(resp >= 0){
				for(int i=0;i<gaeNuevo.getListaAlumnosGAE().size();i++){
					gaeNuevo.getListaAlumnosGAE().get(i).setId_curso(gaeOriginal.getId_curso());
					resp = alumnoDB.asignarAlumnoGae(gaeNuevo, gaeNuevo.getListaAlumnosGAE().get(i));
					if(resp < 1){
						resp = -1;
						break;
					}
				}
			}
			
			//Asignamos al nuevo alumno representante.
			if(resp >= 0){
				resp = alumnoDB.asignarAlumnoRepresentante(gaeNuevo);
			}
		}
		if(resp > 0){
			this.connection.commit();
		}else{
			this.connection.rollback();
		}
		try{
			this.connection.getConnection().close();
		}catch (SQLException e){
			e.printStackTrace();
		}
		return resp;
	}
	*/
}
